package practice1_100;
import practice1_100.ListNode;

public class Practice23 {
    //虽然是难题，但是可以参照21题的两个链表合并的办法，一个个遍历，然后调用两两合并
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0) return null;
        ListNode head=null;
        for (ListNode listNode: lists) {
           head= mergeTwoLists(head,listNode);
        }
        return head;
    }

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //弄出头、尾指针保存列表头
        ListNode head=new ListNode();
        ListNode rear=head;

        //判断简单情况，都为空返回空
        if(l1==null&&l2==null) return null;
//        if(l1==null&&l2!=null) return l2;
//        if(l2==null&&l1!=null) return l1;

        //两个列表都不为空遍历
        while (l1!=null&&l2!=null){
            if(l1.val<l2.val){
                rear.next=l1;
                l1=l1.next;
                rear=rear.next;
            }else {
                rear.next=l2;
                l2=l2.next;
                rear=rear.next;
            }
        }

        //剩余哪个就把最后的加到末尾
        if(l1==null){
            rear.next=l2;
        }
        if(l2==null){
            rear.next=l1;
        }
        return head.next;
    }
}
